/**
 * \file irda.c
 * \brief Driver et controle irda.
 * \author Mathieu.B
 * \version 0.8
 * \date 11 mars 2011
 *
 * Fichier d'implémentation des APIs et des fonctions de controle de l'IRDA.
 *
 */
 
//******************************************************************************
//  MSP-FET430P140 IrDA
//
//  Description: Configuration et utilisation de L'UART0 pour la liaison IrDA
//  
//  ACLK utilisée avec 8 MHz
//  Baud rate : 1786 bauds
//  //* An external 8Mhz XTAL on XIN XOUT is required for ACLK *//
//  	
//
//
//                MSP430F149
//             -----------------
//         /|\|              XIN|-
//          | |                 | 8MHz
//          --|RST          XOUT|-
//            |                 |
//            |             P3.4|------------>
//            |                 | 1786 bauds
//            |             P3.5|<------------
//
//
//  OT-SETRE
//  Mathieu Barbe
//  Feb 2010
//  
//******************************************************************************

#include <msp430x14x.h>
#include <io.h>
#include <signal.h>
#include <iomacros.h>
#include <stdio.h>
#include <stdlib.h>

#include "irda.h"
#include "../utils/utils.h"


extern OS_EVENT *ButtonMbox;




interrupt (UART0RX_VECTOR) irdaHeader(void)
{
	static char etapeSynchro=1;
	
	static int irdaCommande;
	char charRx;
	


	//OS interruption
	LPM3_EXIT;
	//Récupération de l'octet dans le buffer de l'UART
	charRx=RXBUF0;
	
	
	//Synchronisation avec la télécommande Apple
	//Pour reconnaitre la télécommande on utilise trois Bytes avant
	//les bytes de commande
	//ETAPE 1 : Premier byte de synchro
	//ETAPE 2 : Deuxième byte de synchro
	//ETAPE 3 : Troisième byte de synchro
	//ETAPE 4 : Premier byte de commande
	//ETAPE 5 : Deuxième byte de commande et reconnaisance de caractère
	
	switch(etapeSynchro)
	{
		case 1:
			if(charRx==BYTE_SYNC_1)
			{
				etapeSynchro=2; //Byte de contrôle 1 reconnu, pssage en 2
				irdaCommande=0;
			}
			else
			{
				irdaCommande=COM_ERR;
				//OSMboxPost(IrdaMbox, (void *)&irdaCommande);
			}
		break;
		case 2:
			if(charRx==BYTE_SYNC_2)
			{
				etapeSynchro=3; //Byte de contrôle 2 reconnu, pssage en 3
			}
			else
			{
				etapeSynchro=1; //Mauvaise synchro, retour en 1
			}
		break;
		case 3:
			if(charRx==BYTE_SYNC_3)
			{
				etapeSynchro=4; //Byte de contrôle 1 reconnu, pssage en 4
			}
			else
			{
				etapeSynchro=1;  //Mauvaise synchro, retour en 1
			}
		break;
		case 4:
			irdaCommande=charRx;	// Enregistrement du premier byte de la commande
			etapeSynchro=5;			
		break;
		case 5:
			irdaCommande|=charRx<<8;	//Enregistrement du deuxième byte de la commande
			etapeSynchro=6;				//Retour à l'étape un pour la prochaine intérruption
			
			switch(irdaCommande)		//Reconnaissance du code envoyé par la télécommande.
			{
				case CODE_MENU:
					irdaCommande=COM_MENU;
				break;

				case CODE_MORE:
					irdaCommande=COM_MORE;
				break;
				
				case CODE_LESS:
					irdaCommande=COM_LESS;
				break;
				
				case CODE_NEXT:
					irdaCommande=COM_NEXT;
				break;
				
				case CODE_PREV:
					irdaCommande=COM_PREV;
				break;
				
				case CODE_PLAY:
					irdaCommande=COM_PLAY;
				break;
				
				default :
				//CODE non reconu
					irdaCommande=COM_ERR;
					
				break;

				
				
			}
			OSMboxPost(ButtonMbox, (void *)irdaCommande);
			
		break;
		case 6:
			if(charRx==BYTE_LONG_1)
			{
				etapeSynchro=7; //Byte de contrôle 1 reconnu, pssage en 4
			}
			
			else
			{
				etapeSynchro=1;
			}
		break;
		case 7:
			if(charRx==BYTE_LONG_2)
			{
				etapeSynchro=8; //Byte de contrôle 1 reconnu, pssage en 4
			}
			
			else
			{
				etapeSynchro=1;
			}
		break;
		case 8:
			if(charRx==BYTE_LONG_3)
			{
				etapeSynchro=9; //Byte de contrôle 1 reconnu, pssage en 4
			}
			
			else
			{
				etapeSynchro=1;
			}
		break;
		case 9:
			if(charRx==BYTE_LONG_1)
			{
				etapeSynchro=10; //Byte de contrôle 1 reconnu, pssage en 4
			}
			
			else
			{
				etapeSynchro=1;
			}
		break;
		case 10:
			if(charRx==BYTE_LONG_2)
			{
				etapeSynchro=11; //Byte de contrôle 1 reconnu, pssage en 4
			}
			
			else
			{
				etapeSynchro=1;
			}
		break;
		case 11:
			if(charRx==BYTE_LONG_3)
			{
				etapeSynchro=12; //Byte de contrôle 1 reconnu, pssage en 4
			}
			
			else
			{
				etapeSynchro=1;
			}
		break;
		case 12:
			if(charRx==BYTE_LONG_1)
			{
				etapeSynchro=13; //Byte de contrôle 1 reconnu, pssage en 4
			}

			else
			{
				etapeSynchro=1;
			}
			
		break;
		case 13:
			if(charRx==BYTE_LONG_2)
			{
				etapeSynchro=14; //Byte de contrôle 1 reconnu, pssage en 4
			}
			else
			{
				etapeSynchro=1;
			}
			
		break;
		case 14:
			
			if(charRx==BYTE_LONG_3)
			{
				irdaCommande=irdaCommande+(COM_MORE_LONG-COM_MORE);
				OSMboxPost(ButtonMbox, (void *)irdaCommande);	
			}	
				
			etapeSynchro=1;
			
		break;
		
		
		default:
			//Normalement jamais executé, sécurité si problème
			etapeSynchro=1;
		break;
	
	}
 
}

void irdaInit(void)
{
	
  
  	
  //-- Multiplex le periph�que UART sur le port 3 : 3.4 et 3.5 --//
  P3SEL |= 0x30;                            
  
  //-------------  RESET UART -----------------//  
  UCTL0 |= SWRST;	// UART Software RESET
  					// Normalement � 1 apr�s RESET
  					// Permet de configurer l'UART
  
  //-- Activation du p�riph�rique USART0 TXD/RXD --//
  ME1 |= UTXE0 + URXE0;            
  
  
  //-------------  Registre UCTL0 -----------------// 
  //	PENA = 0	: Parity disable
  //	PEV			: Not Use
  //	SPB	= 0		: 1 bit STOP transmitted
  //	CHAR = 1	: 8 bit de data length
  //	LISTEN = 0	: disable loop Tx --> Rx
  //	SYNC = 0 	: UART mode
  //	MM = 0		: No multiprocessor
  //	SWRST = 0	: RESET 		
  UCTL0 |= CHAR;                          // 8-bit character
  
  //-------------  Registre UTCTL0 -----------------// 
  //	CKPL = 0 	: Clock polarity Normal
  //	SSEL0 = 1	: Source horloge ACLK
  //	URXS0 = 0	: UART receive start-edge disable
  //	TXWAKE = 0 	: Next char is DATA
  UTCTL0 |=  SSEL_ACLK;                          // UCLK= ACLK
  
  //-------------  Registre URCTL0 -----------------//
  // NOP
  
  //-------------  Baud Rate Control ---------------//
  // On veut 1786 bauds avec une horloge BRCLK = 1MHz
  // 1M/1786=  = 0x 022F
  UBR00 = 0x2F;                             // 8MHz 14400
  UBR10 = 0x02;                             // 8MHz 14400
  
  // Am�lioration du taux d'erreur
  UMCTL0 = 0xDF;                            // 8MHz 9600 modulation
  
  
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  
  //-------------  Interrupt Enable ---------------//
  IE1 |= URXIE0;                            // Enable USART0 RX interrupt

  
 
}

